home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 1 / Amiga Tools.iso / wb-tools / toolmanager / source / library / menuobj.c < prev    next >
C/C++ Source or Header  |  1994-06-06  |  6KB  |  187 lines

  1. /*
  2.  * menuobj.c  V2.1
  3.  *
  4.  * TMObject, Type: Menu
  5.  *
  6.  * (c) 1990-1993 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerLib.h"
  10.  
  11. /* extended TMObject structure for TMOBJTYPE_MENU objects */
  12. struct TMObjectMenu {
  13.                      struct TMObject  mo_Object;
  14.                      struct TMLink   *mo_ExecLink;
  15.                      struct TMLink   *mo_SoundLink;
  16.                      struct TMLink    mo_Link;
  17.                      void            *mo_AppMenu;
  18.                     };
  19.  
  20. /* Create a Menu object */
  21. struct TMObject *CreateTMObjectMenu(struct TMHandle *handle, char *name,
  22.                                     struct TagItem *tags)
  23. {
  24.  /* Open Workbench */
  25.  if (GetWorkbench()) {
  26.   struct TMObjectMenu *tmobj;
  27.  
  28.   /* allocate memory for object */
  29.   if (tmobj=(struct TMObjectMenu *)
  30.              AllocateTMObject(sizeof(struct TMObjectMenu))) {
  31.    struct TagItem *ti,*tstate;
  32.  
  33.    /* Scan tag list */
  34.    tstate=tags;
  35.    while (ti=NextTagItem(&tstate)) {
  36.  
  37.     DEBUG_PRINTF("Got Tag (0x%08lx)\n",ti->ti_Tag);
  38.  
  39.     switch (ti->ti_Tag) {
  40.      case TMOP_Exec:  if (ti->ti_Data) {
  41.                        if (tmobj->mo_ExecLink) /* Already got a link? */
  42.                         /* Yep. Remove it! */
  43.                         RemLinkTMObject(tmobj->mo_ExecLink);
  44.  
  45.                        /* Create new link to exec object */
  46.                        tmobj->mo_ExecLink=AddLinkTMObject(handle,
  47.                                                           (char *) ti->ti_Data,
  48.                                                           TMOBJTYPE_EXEC,
  49.                                                           (struct TMObject *)
  50.                                                            tmobj);
  51.                       }
  52.                       break;
  53.      case TMOP_Sound: if (ti->ti_Data) {
  54.                        if (tmobj->mo_SoundLink) /* Already got a link? */
  55.                        RemLinkTMObject(tmobj->mo_SoundLink); /* Remove it! */
  56.  
  57.                       /* Create new link to exec object */
  58.                       tmobj->mo_SoundLink=AddLinkTMObject(handle,
  59.                                                           (char *) ti->ti_Data,
  60.                                                           TMOBJTYPE_SOUND,
  61.                                                           (struct TMObject *)
  62.                                                            tmobj);
  63.                       }
  64.                       break;
  65.     }
  66.    }
  67.  
  68.    /* Add menu entry */
  69.    if (tmobj->mo_AppMenu=AddAppMenuItemA((ULONG) &tmobj->mo_Link,NULL,name,
  70.                                          AppMsgPort,NULL)) {
  71.     /* Initialize rest of structure */
  72.     tmobj->mo_Link.tml_Linked=(struct TMObject *) tmobj;
  73.  
  74.     /* All OK */
  75.     return(tmobj);
  76.    }
  77.    else {
  78.     /* Remove links */
  79.     if (tmobj->mo_ExecLink) RemLinkTMObject(tmobj->mo_ExecLink);
  80.     if (tmobj->mo_SoundLink) RemLinkTMObject(tmobj->mo_SoundLink);
  81.    }
  82.    FreeMem(tmobj,sizeof(struct TMObjectMenu));
  83.   }
  84.   FreeWorkbench();
  85.  }
  86.  /* call failed */
  87.  return(NULL);
  88. }
  89.  
  90. /* Delete a Menu object */
  91. BOOL DeleteTMObjectMenu(struct TMObjectMenu *tmobj)
  92. {
  93.  DEBUG_PRINTF("Delete/Menu (0x%08lx)\n",tmobj);
  94.  
  95.  /* Free resources */
  96.  SafeRemoveAppMenuItem(tmobj->mo_AppMenu,&tmobj->mo_Link);
  97.  FreeWorkbench();
  98.  
  99.  /* Remove links */
  100.  if (tmobj->mo_ExecLink) RemLinkTMObject(tmobj->mo_ExecLink);
  101.  if (tmobj->mo_SoundLink) RemLinkTMObject(tmobj->mo_SoundLink);
  102.  
  103.  /* Remove object from list */
  104.  Remove((struct Node *) tmobj);
  105.  
  106.  /* Free object */
  107.  FreeMem(tmobj,sizeof(struct TMObjectMenu));
  108.  
  109.  /* All OK. */
  110.  return(TRUE);
  111. }
  112.  
  113. /* Change a Menu object */
  114. struct TMObject *ChangeTMObjectMenu(struct TMHandle *handle,
  115.                                     struct TMObjectMenu *tmobj,
  116.                                     struct TagItem *tags)
  117. {
  118.  struct TagItem *ti,*tstate;
  119.  
  120.  /* Scan tag list */
  121.  tstate=tags;
  122.  while (ti=NextTagItem(&tstate)) {
  123.  
  124.   DEBUG_PRINTF("Got Tag (0x%08lx)\n",ti->ti_Tag);
  125.  
  126.   switch (ti->ti_Tag) {
  127.    case TMOP_Exec:  if (tmobj->mo_ExecLink) { /* Already got a link? */
  128.                      /* Yep. Remove it! */
  129.                      RemLinkTMObject(tmobj->mo_ExecLink);
  130.                      tmobj->mo_ExecLink=NULL;
  131.                     }
  132.  
  133.                     if (ti->ti_Data) {
  134.                      /* Create new link to exec object */
  135.                      tmobj->mo_ExecLink=AddLinkTMObject(handle,
  136.                                                         (char *) ti->ti_Data,
  137.                                                         TMOBJTYPE_EXEC,
  138.                                                         (struct TMObject *)
  139.                                                          tmobj);
  140.                     }
  141.                     break;
  142.    case TMOP_Sound: if (tmobj->mo_SoundLink) { /* Already got a link? */
  143.                      /* Yep. Remove it! */
  144.                      RemLinkTMObject(tmobj->mo_SoundLink);
  145.                      tmobj->mo_SoundLink=NULL;
  146.                     }
  147.  
  148.                     if (ti->ti_Data) {
  149.                      /* Create new link to exec object */
  150.                      tmobj->mo_SoundLink=AddLinkTMObject(handle,
  151.                                                          (char *) ti->ti_Data,
  152.                                                          TMOBJTYPE_SOUND,
  153.                                                          (struct TMObject *)
  154.                                                           tmobj);
  155.                     }
  156.                     break;
  157.   }
  158.  }
  159.  
  160.  /* All OK. */
  161.  return(TRUE);
  162. }
  163.  
  164. /* Update link structures */
  165. void DeleteLinkTMObjectMenu(struct TMLink *tml)
  166. {
  167.  struct TMObjectMenu *tmobj=(struct TMObjectMenu *) tml->tml_LinkedTo;
  168.  
  169.  /* Clear link */
  170.  if (tml==tmobj->mo_ExecLink)
  171.   tmobj->mo_ExecLink=NULL;
  172.  else if (tml==tmobj->mo_SoundLink)
  173.   tmobj->mo_SoundLink=NULL;
  174. }
  175.  
  176. /* Activate a Menu object */
  177. void ActivateTMObjectMenu(struct TMLink *tml, struct AppMessage *msg)
  178. {
  179.  struct TMObjectMenu *tmobj=(struct TMObjectMenu *) tml->tml_Linked;
  180.  
  181.  /* Activate Sound object */
  182.  if (tmobj->mo_SoundLink) CallActivateTMObject(tmobj->mo_SoundLink,NULL);
  183.  
  184.  /* Activate Exec object */
  185.  if (tmobj->mo_ExecLink) CallActivateTMObject(tmobj->mo_ExecLink,msg);
  186. }
  187.